using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using UnityEngine.Tilemaps;

public class BuildingSystem : MonoBehaviour
{
    // [SerializeField] private Item item;             // 当前选中的物品
    [SerializeField] private TileBase highlightTile; // 高亮显示瓦片所使用的 TileBase
    [SerializeField] private Tilemap mainTilemap;   // 主要的地图瓦片对象
    [SerializeField] private Tilemap tempTilemap;   // 临时地图瓦片对象，用于显示高亮瓦片
    private Vector3Int highlightedTilePos;          // 高亮显示的瓦片在网格中的位置
    private bool highlighted;                       // 是否在高亮显示
    private Vector3Int playerPos;   //玩家位置

    [SerializeField] private GameObject lootPrefab;// 拾取物品时生成的对象

    private void Update()
    {
        Item item = InventoryManager.instance.GetSelectedItem(false);
        playerPos = mainTilemap.WorldToCell(transform.position);
        // 如果当前有选中的物品，则在 Update 方法中更新高亮显示
        if (item != null)
        {
            HighlightTile(item);
        }
        if (Input.GetMouseButtonDown(0))// 当玩家按下左键时
        {
            if (highlighted)
            {
                if (item.type == ItemType.BuildingBlock)// 如果当前选中的物品是建筑方块
                {
                    Build(highlightedTilePos, item);// 放置方块
                }
                else if (item.type == ItemType.Tool)// 如果当前选中的物品是工具
                {
                    Destroy(highlightedTilePos);// 移除方块
                }
            }
        }
    }

    private Vector3Int GetMouseOnGridPos()
    {
        // 获取鼠标在当前网格中的位置
        Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3Int mouseCellPos = mainTilemap.WorldToCell(mousePos);
        mouseCellPos.z = 0;
        return mouseCellPos;
    }

    private void HighlightTile(Item currentItem)
    {
        // 获取鼠标在当前网格中的位置
        Vector3Int mouseGridPos = GetMouseOnGridPos();

        // 如果当前高亮显示的瓦片位置不等于鼠标位置，则更新高亮显示
        if (highlightedTilePos != mouseGridPos)
        {
            // 清除之前高亮显示的瓦片
            tempTilemap.SetTile(highlightedTilePos, null);

            // 检查鼠标位置与玩家位置是否在范围内
            if (InRange(playerPos, mouseGridPos, (Vector3Int)currentItem.range))
            {
                // 获取鼠标位置上的瓦片，并检查条件 GetTile获取指定坐标格子瓦片
                if (CheckCondition(mainTilemap.GetTile<RuleTileWithData>(mouseGridPos), currentItem))
                {
                    // 在临时地图瓦片对象上高亮显示瓦片
                    tempTilemap.SetTile(mouseGridPos, highlightTile);
                    highlightedTilePos = mouseGridPos;
                    highlighted = true;
                }
                else
                {
                    highlighted = false;
                }
            }
            else
            {
                highlighted = false;
            }
        }
    }

    //判断鼠标位置与玩家位置是否在范围内
    private bool InRange(Vector3Int positionA, Vector3Int positionB, Vector3Int range)
    {
        // 判断两个位置之间的距离是否在范围内
        Vector3Int distance = positionA - positionB;
        if (Math.Abs(distance.x) >= range.x || Math.Abs(distance.y) >= range.y)
        {
            return false;
        }
        return true;
    }

    //检查瓦片与当前物品的条件是否匹配
    private bool CheckCondition(RuleTileWithData tile, Item currentItem)
    {
        
        // 检查瓦片与当前物品的条件是否匹配
        if (currentItem.type == ItemType.BuildingBlock)
        {
            if (!tile)
            {
                return true;
            }
        }
        else if (currentItem.type == ItemType.Tool)
        {
            if (tile)
            {
                if (tile.item.actionType == currentItem.actionType)
                {
                    return true;
                }
            }
        }
        return false;
    }

    // 放置方块
    private void Build(Vector3Int position, Item itemToBuild)
    {
        InventoryManager.instance.GetSelectedItem(true);

        tempTilemap.SetTile(position, null);// 清除临时 Tilemap 上的方块
        highlighted = false;// 取消高亮状态
        mainTilemap.SetTile(position, itemToBuild.tile);// 在主 Tilemap 上放置方块
    }

    // 移除方块以及生成相应物品
    private void Destroy(Vector3Int position)
    {
        tempTilemap.SetTile(position, null);// 清除临时 Tilemap 上的方块
        highlighted = false;// 取消高亮状态
        RuleTileWithData tile = mainTilemap.GetTile<RuleTileWithData>(position);// 获取当前位置上的方块数据
        mainTilemap.SetTile(position, null);// 在主 Tilemap 上移除方块
        Vector3 pos = mainTilemap.GetCellCenterWorld(position);// 获取方块中心的世界坐标
        GameObject loot = Instantiate(lootPrefab, pos, Quaternion.identity);// 创建拾取物品
        loot.GetComponent<Loot>().Initialize(tile.item);// 初始化拾取物品数据
    }
}
